package client

import (
	"github.com/mars/internal/admin/core/domain"
)

// CartItemView 用于前端展示的购物车项信息
type CartItemView struct {
	ID          string       `json:"_id,omitempty"`
	OpenID      string       `json:"openid"`
	ProductID   string       `json:"productId"`
	Quantity    int          `json:"quantity"`
	Status      string       `json:"status"`
	StatusText  string       `json:"statusText"` // 状态文本
	CreateTime  string       `json:"createTime"`
	UpdateTime  string       `json:"updateTime"`
	ProductInfo *ProductView `json:"productInfo,omitempty"` // 产品信息
	UserInfo    *UserInfo    `json:"userInfo,omitempty"`    // 用户基本信息（简化版）
	// 计算字段
	TotalPrice int  `json:"totalPrice"` // 总价格（数量 * 单价）
	IsExpired  bool `json:"isExpired"`  // 是否过期
}

// UserInfo 购物车中的用户信息（简化版）
type UserInfo struct {
	OpenID    string `json:"openid"`
	NickName  string `json:"nickName,omitempty"`
	AvatarUrl string `json:"avatarUrl,omitempty"`
}

// CartStatsView 购物车统计视图
type CartStatsView struct {
	TotalItems      int64                 `json:"totalItems"`      // 总购物车项数
	TotalUsers      int64                 `json:"totalUsers"`      // 有购物车的用户数
	ActiveItems     int64                 `json:"activeItems"`     // 有效购物车项数
	InactiveItems   int64                 `json:"inactiveItems"`   // 无效购物车项数
	ExpiredItems    int64                 `json:"expiredItems"`    // 过期购物车项数
	ItemsByStatus   map[string]int64      `json:"itemsByStatus"`   // 按状态统计
	TopProducts     []CartProductStatView `json:"topProducts"`     // 热门购物车商品
	AvgItemsPerUser float64               `json:"avgItemsPerUser"` // 每用户平均购物车项数
	TotalQuantity   int64                 `json:"totalQuantity"`   // 总商品数量
	ConversionRate  float64               `json:"conversionRate"`  // 购物车转化率
	// 扩展统计
	StatusDistribution []StatusDistributionItem `json:"statusDistribution"` // 状态分布
}

// CartProductStatView 购物车商品统计视图
type CartProductStatView struct {
	ProductID     string `json:"productId"`
	ProductName   string `json:"productName"`
	ProductImage  string `json:"productImage,omitempty"`
	CartCount     int64  `json:"cartCount"`     // 加入购物车次数
	TotalQuantity int64  `json:"totalQuantity"` // 总数量
}

// StatusDistributionItem 状态分布项
type StatusDistributionItem struct {
	Status     string  `json:"status"`
	StatusText string  `json:"statusText"`
	Count      int64   `json:"count"`
	Percentage float64 `json:"percentage"`
}

// ToCartItemView 将domain.CartItem转换为CartItemView
func ToCartItemView(cartItem *domain.CartItem) *CartItemView {
	if cartItem == nil {
		return nil
	}

	view := &CartItemView{
		ID:         cartItem.ID,
		OpenID:     cartItem.OpenID,
		ProductID:  cartItem.ProductID,
		Quantity:   cartItem.Quantity,
		Status:     string(cartItem.Status),
		StatusText: getCartStatusText(cartItem.Status),
		CreateTime: formatTimestamp(cartItem.CreateTime, TimeFormatDateTime),
		UpdateTime: formatTimestamp(cartItem.UpdateTime, TimeFormatDateTime),
	}

	// 转换产品信息
	if cartItem.ProductInfo != nil {
		view.ProductInfo = ToProductView(cartItem.ProductInfo)
		view.TotalPrice = cartItem.ProductInfo.Price * cartItem.Quantity
	}

	// 设置过期状态
	view.IsExpired = cartItem.Status == domain.CartStatusExpired

	return view
}

// ToCartItemViewList 将domain.CartItem列表转换为CartItemView列表
func ToCartItemViewList(cartItems []domain.CartItem) []CartItemView {
	views := make([]CartItemView, len(cartItems))
	for i, cartItem := range cartItems {
		if view := ToCartItemView(&cartItem); view != nil {
			views[i] = *view
		}
	}
	return views
}

// ToCartStatsView 将domain.CartStats转换为CartStatsView
func ToCartStatsView(stats *domain.CartStats) *CartStatsView {
	if stats == nil {
		return nil
	}

	view := &CartStatsView{
		TotalItems:      stats.TotalItems,
		TotalUsers:      stats.TotalUsers,
		ActiveItems:     stats.ActiveItems,
		InactiveItems:   stats.InactiveItems,
		ExpiredItems:    stats.ExpiredItems,
		ItemsByStatus:   stats.ItemsByStatus,
		TopProducts:     ToCartProductStatViewList(stats.TopProducts),
		AvgItemsPerUser: stats.AvgItemsPerUser,
		TotalQuantity:   stats.TotalQuantity,
		ConversionRate:  stats.ConversionRate,
	}

	// 构建状态分布
	view.StatusDistribution = buildStatusDistribution(stats)

	return view
}

// ToCartProductStatViewList 将domain.ProductStat列表转换为CartProductStatView列表
func ToCartProductStatViewList(stats []domain.ProductStat) []CartProductStatView {
	views := make([]CartProductStatView, len(stats))
	for i, stat := range stats {
		views[i] = CartProductStatView{
			ProductID:     stat.ProductID,
			ProductName:   stat.ProductName,
			CartCount:     stat.OrderCount,  // 这里用订单数量代替购物车次数
			TotalQuantity: stat.TotalAmount, // 这里用总金额代替总数量
		}
	}
	return views
}

// buildStatusDistribution 构建状态分布
func buildStatusDistribution(stats *domain.CartStats) []StatusDistributionItem {
	items := []StatusDistributionItem{
		{
			Status:     string(domain.CartStatusActive),
			StatusText: getCartStatusText(domain.CartStatusActive),
			Count:      stats.ActiveItems,
		},
		{
			Status:     string(domain.CartStatusInactive),
			StatusText: getCartStatusText(domain.CartStatusInactive),
			Count:      stats.InactiveItems,
		},
		{
			Status:     string(domain.CartStatusExpired),
			StatusText: getCartStatusText(domain.CartStatusExpired),
			Count:      stats.ExpiredItems,
		},
	}

	// 计算百分比
	for i := range items {
		if stats.TotalItems > 0 {
			items[i].Percentage = float64(items[i].Count) / float64(stats.TotalItems) * 100
		}
	}

	return items
}

// getCartStatusText 获取购物车状态文本
func getCartStatusText(status domain.CartStatus) string {
	statusMap := map[domain.CartStatus]string{
		domain.CartStatusActive:   "有效",
		domain.CartStatusInactive: "无效",
		domain.CartStatusExpired:  "过期",
	}
	return statusMap[status]
}
